/*
 *Autor: Anderson Campos Cardoso
 *
 *Conteúdo: Arquivo que contém a implementação dos métodos da classe Sprite
 */

#include "Sprite.h"

#ifndef _SPRITE_CPP_
#define _SPRITE_CPP_

using namespace std;

/*
 *Carrega a imagem no atributo imagem
 */
void Sprite::carregarImagem(string nomeArquivo)
{
   if((imagem = IMG_Load(nomeArquivo.c_str()))== NULL)//string.c_str() retorna um char equivalente a string
      fprintf(stderr,"Erro ao carregar arquivo de Sprite %s\n",IMG_GetError());
}

/*
 *
 */
 void Sprite::setVideo(Video *p_video)
 {
   video = p_video;
 }

/*
 *
 */
void Sprite::setRelogio(Relogio *p_relogio)
{
   relogio = p_relogio;
}

/*
 *Edita o valor do atributo quadro
 */
void Sprite::setQuadro(int valor)
{
   quadro = valor;
}

/*
 *Retorna o valor atual do atributo quadro
 */
Uint32 Sprite::getQuadro(void)
{
   return quadro;
}

/*
 *Incrementa em uma unidade o atributo quadro
 */
void Sprite::incrementaQuadro(void)
{
   ++quadro;
}


/*
 *seta o retângulo de origem do Sprite
 */
void Sprite::setOrig(Sint16 _x, Sint16 _y, Uint16 _w, Uint16 _h)
{
   orig->x = _x; //posição x do sprite no mapa do sprite
   orig->y = _y; //posição y do sprite no mapa de sprite
   orig->w = _w; //largura do sprite
   orig->h = _h; //altura do sprite
}

/*
 *seta o retângulo de destino do Sprite
 */
void Sprite::setDest(float _x,float _y,Uint16 _w,Uint16 _h)
{
   dest->x = _x; //posição x do sprite na janela
   dest->y = _y; //posição y do sprite na janela
   dest->w = _w; //largura do sprite
   dest->h = _h; //altura do sprite
}


/*
 *seta o retângulo de origem e de destino ao mesmo tempo
 */
void Sprite::setarSprite(int _x,int _y,int _w,int _h)
{
   setOrig(_x,_y,_w,_h); /*seta as coordenadas da imagem de origem do Sprite*/
   setDest(dest->x,dest->y,_w,_h);   /*as coordenadas de estino x,y podem conter qualquer valor pois só serão computados no método Sprite::blitSprite*/
}

/*
 *Edita o valor do atributo delta_x
 */
void Sprite::setDelta_x(int _x)
{
   delta_x = _x;
}

/*
 *Edita o valor do atributo delta_y
 */
void Sprite::setDelta_y(int _y)
{
   delta_y = _y;
}

/*
 *Edita o valor dos atributos delta_x e delta_y
 */
void Sprite::setarDeltaXY(int _x,int _y)
{
   setDelta_x(_x);
   setDelta_y(_y);
}

/*
 *Edita o valor dos atributos vx
 */
void Sprite::setVx(float _vx)
{
   vx = _vx;
}

/*
 *Edita o valor dos atributos vy
 */
void Sprite::setVy(float _vy)
{
   vy = _vy;
}

/*
 *Retorna o valor do parametro video
 */
Video* Sprite::getVideo()
{
   return video;
}

/*
 *Retorna o valor do parametro relogio
 */
Relogio* Sprite::getRelogio()
{
   return relogio;
}

/*
 *
 */
float Sprite::getVx()
{
   return vx;
}

/*
 *
 */
float Sprite::getVy()
{
   return vy;
}


/*
 *Limpa o sprite da cena
 */
void Sprite::limparSprite()
{
	SDL_Rect auxDest;
	auxDest.x = dest->x + delta_x;	//variação da posição x do sprite na janela
	auxDest.y = dest->y + delta_y;	//variação da posição y do sprite na janela
	auxDest.w = dest->w;
	auxDest.h = dest->h;
	if(video != NULL)
	   video->limpaCena(&auxDest);
}

/*
 *realiza um blit do sprite com a cena
 */
void Sprite::blitSprite()
{
	//desloca o sprite na cena de acordo com a sua velocidade
	dest->x = dest->x + vx*relogio->getDeltaTempo();
	dest->y = dest->y + vy*relogio->getDeltaTempo();

	SDL_Rect auxDest;
	auxDest.x = (Sint16) (dest->x + delta_x);	//variação da posição x do sprite na janela
	auxDest.y = (Sint16) (dest->y + delta_y);	//variação da posição y do sprite na janela
	auxDest.w = dest->w;
	auxDest.h = dest->h;
	if(video != NULL)
	   video->blitImagemCena(imagem,orig,&auxDest);
}

/*
 *Construtor da classe
 */
Sprite::Sprite(void)
{
   video = NULL;
   relogio = NULL;

   orig = new SDL_Rect;
   dest = new DEST_Rect;

   vx = 0;
   vy = 0;

   delta_x = 0;
   delta_y = 0;

   quadro = 1;

}

Sprite::Sprite(string nomeArquivo, Video *_video, Relogio *_relogio, Sint16 orig_x, Sint16 orig_y, Uint16 orig_w, Uint16 orig_h, float dest_x, float dest_y, Uint16 dest_w, Uint16 dest_h)
{
   video = _video;
   relogio = _relogio;

   orig = new SDL_Rect;
   dest = new DEST_Rect;

   vx = 0;
   vy = 0;

   delta_x = 0;
   delta_y = 0;

   quadro = 1;

   setOrig(orig_x, orig_y, orig_w, orig_h);
   setDest(dest_x, dest_y, dest_w, dest_h);

   carregarImagem(nomeArquivo);
}

/*
 *Destrutor da classe
 */
Sprite::~Sprite(void)
{
	delete orig;
	delete dest;
	if (imagem != NULL)
		SDL_FreeSurface(imagem);
}

#endif
